def sub_generator():
    yield 1
    yield 2
    yield 3


def main_generator():
    yield 'A'
    yield from sub_generator()
    yield from [11, 12, 13]
    yield from [31, 22, 23]
    return 99  # for 循环不会捕获到 StopIteration 故而无法拿到返回值
    yield from range(31, 34)
    yield 'B'


for i in main_generator():
    print(i)


"""
在使用yield生成器的时候，如果使用for语句去迭代生成器，
则不会显式的出发StopIteration异常，而是自动捕获StopIteration异常，
所以如果遇到return，只是会终止迭代，而不会触发异常，故而也就没办法获取return的值
"""


def test_generator():
    for i in range(5):
        if i == 2:
            return "我被迫中断了"
        yield i


def main2(g):
    try:
        print(next(g))  # 每次迭代一个值，则会显式出发StopIteration
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
    except StopIteration as e:
        print(e.value)  # 获取返回的值


g = test_generator()
main2(g)
